#ifndef _COM_SENTRY_HPP_
#define _COM_SENTRY_HPP_

#include <crt_util.h>
#include <utilex/safeptr.hpp>

namespace StdCom
{

struct co_interface_sentry {
    static void* default_value() { return 0; }
    template <class _Ptr> static bool equal_to(_Ptr, _Ptr) { return false; }
    template <class _Ptr> static void destroy(_Ptr p)
    {
        if (p) {
            p->Release();
        }
    }
};

template <class I> class ComPtr : public SafePtr<I*, co_interface_sentry>
{
public:
    typedef SafePtr<I*, co_interface_sentry> base;
    using base::m_p;

    ComPtr() : base() { }
    void attach(I* p)
    {
        base::dispose();
        m_p = p;
    }
};

} // namespace StdCom

#define _lComPtr StdCom::ComPtr

#endif
